/*
 * Copyright (c) 2021 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef <NAMESPACE>_<SUBSYS_NAME>_INNERKITS_<KEY_WORD>_SRV_CLIENT_H_
#define <NAMESPACE>_<SUBSYS_NAME>_INNERKITS_<KEY_WORD>_SRV_CLIENT_H_

#include <singleton.h>
#include <memory>
#include <mutex>
#include "iremote_object.h"
#include "i<key_word>_srv.h"

namespace <namespace> {
namespace <Subsys_name> {
class <Key_word>SrvClient final : public DelayedRefSingleton<<Key_word>SrvClient> {
    DECLARE_DELAYED_REF_SINGLETON(<Key_word>SrvClient)

 public:
    DISALLOW_COPY_AND_MOVE(<Key_word>SrvClient);

   <declare>

 private:
    class <Key_word>SrvDeathRecipient : public IRemoteObject::DeathRecipient {
     public:
        <Key_word>SrvDeathRecipient() = default;
        ~<Key_word>SrvDeathRecipient() = default;
        void OnRemoteDied(const wptr<IRemoteObject>& remote);
     private:
        DISALLOW_COPY_AND_MOVE(<Key_word>SrvDeathRecipient);
    };

    ErrCode Connect();
    sptr<I<Key_word>Srv> proxy_ {nullptr};
    sptr<IRemoteObject::DeathRecipient> deathRecipient_ {nullptr};
    void ResetProxy(const wptr<IRemoteObject>& remote);
    std::mutex mutex_;
};
} // namespace <Subsys_name>
} // namespace <namespace>

#endif // <NAMESPACE>_<SUBSYS_NAME>_INNERKITS_<KEY_WORD>_SRV_CLIENT_H_
